<?php


namespace app\api\service;

use Endroid\QrCode\QrCode;
use think\App;
use think\Env;
use Yansongda\Pay\Pay;

/**
 * 微信支付
 * Class WechatPaymentController
 * @package app\api\service
 */
class WechatPaymentController
{
    public $config = [
        'wechatPay'=>[
            'appid' => '', // APP APPID(微信公众平台上 闪金喵的APPID)
            'app_id' => 'wxd2d733a7163bff05', // 公众号 APPID（）
            'miniapp_id' => '', // 小程序 APPID()
            'mch_id' => '1647413230',//商户号
            'key' => 'jTwAPZXpylR7TCoinWn2srOQUb6ioZlL',//商户号秘钥
            'notify_url' => 'http://fupan.cc/api/test/wechatPayNotify',//微信支付异步回调 @todo 上线的时候吧测试域名改为正式服务器的域名 （https://）
            'cert_client' => '', // optional，退款等情况时用到
            'cert_key' => '',// optional，退款等情况时用到
            'log' => [ // optional
                'file' => 'login/wechat.log',
                'level' => 'debug', // 建议生产环境等级调整为 info，开发环境为 debug
                'type' => 'single', // optional, 可选 daily.
                'max_file' => 30, // optional, 当 type 为 daily 时有效，默认 30 天
            ],
            'http' => [ // optional
                'timeout' => 5.0,
                'connect_timeout' => 5.0,
                // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
            ],
            // 'mode' => 'dev', // optional, dev/hk;当为 `hk` 时，为香港 gateway。
        ],
    ];

    //微信扫码Native支付
    public function wechatNativePay(){
//        $a = $this->nativePay();
//        dd($a);
        $order = [
            'out_trade_no' => time(),
            'body' => 'subject-测试',
            'total_fee'      => '1',
        ];
        $this->config['wechatPay']['cert_client'] = APP_PATH . 'certificate.pem';
        $this->config['wechatPay']['cert_key'] = APP_PATH . 'private_key.pem';
        // 扫码支付使用 模式二
//        dd(Pay::wechat($this->config['wechatPay'])->wap($order)->send());
        $pay = Pay::wechat($this->config['wechatPay'])->scan($order);//拉起H5支付返回重定向地址
        $this->code($pay['code_url']);
    }

    //链接转二维码
    public function code($url){
        // 创建一个QR码实例
        $qrCode = new QrCode($url);

// 设置二维码的大小、颜色等参数
        $qrCode->setSize(300);
        $qrCode->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0]); // 设置前景色为黑色
        $qrCode->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255]); // 设置背景色为白色

        // 将二维码保存为图片文件
        $qrCode->writeFile('path_to_save_qrcode.png');

        // 输出二维码图片到浏览器
        header('Content-Type: '.$qrCode->getContentType());
        echo $qrCode->writeString();
    }

    //支付异步回调
    public function notify()
    {
        $pay = Pay::wechat(config('pay.wechatPay'));
        try {
            $data = $pay->verify(); // 是的，验签就这么简单！返回值为微信回调的订单数据
            //file_put_contents('./login/wechat.text',$data);
            Log::debug('Wechat notify', $data->all());//记录日志
            //判断是否支付成功
            if ($data->return_code == "SUCCESS" && $data->result_code == "SUCCESS") {
                //支付成功
                //防止支付回调成功后重复给用户打款
                if($data->out_trade_no){
                    $cashRecordsExists = CashRecords::where('top_up_order_num',$data->out_trade_no)->exists();//查询是否已经为用户打款
                    if($cashRecordsExists){
                        return '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';// laravel 框架中请直接 `
                    }
                }

                $top_up_order = TopUpOrder::where('order_num', $data->out_trade_no)->first();
                //判断订单是否已经改为支付状态
                if ($top_up_order['pay_status'] == '1') {
                    //订单已经改为支付状态，告知微信服务器停止异步回调
                    $str = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
                    return $str;// laravel 框架中请直接 `return $pay->success()`
                }

                //现金流水记录 （进账收入）
                $actual_payment = bcdiv($data->cash_fee,100,2);//除法->用户实际支付金额(现金支付金额)
//                $actual_payment = $top_up_order['amount_payable'];//用户实际支付金额(现金支付金额)
                $cashRecordsIncome = $this->cashRecordsIncome($top_up_order['userinfors_id'], 3, $actual_payment,$data->out_trade_no);//调用进账

                if (!$cashRecordsIncome['success']) {
                    $developer_remark = '警报！当前用户已经支付成功,但现金记录表尚未记录此单充值！';
                }else{
                    $developer_remark = $top_up_order['developer_remark'];
                }

                //更新订单状态
                $top_up_order->update([
                    'pay_status' => 1,//订单支付状态|默认0：未支付，1：已支付
                    'pay_type' => 1,//支付类型|1：微信
                    'pay_num' => $data->transaction_id,//第三方订单号
                    'pay_time' => date('Y-m-d H:i:s'),//支付时间
                    'actual_payment' => $actual_payment,//用户实际支付金额(现金支付金额)
                    'cash_records_id' => $cashRecordsIncome['cash_records_id'],//现金记录表关联id
                    'developer_remark' => $developer_remark//备注（给后台管理员 and 开发者看的）
                ]);

                $this->topUpFirstTime($top_up_order['userinfors_id'], $actual_payment, date('Y-m-d'));//调用领取每日首次充值奖励(带自动检测功能)


                //订单支付成功 创建极光推送 并发送
                $des = "您的订单{$top_up_order['order_num']}，已经成功支付，付款金额为：{$actual_payment} RMB。";
                //调用极光推送服务
                $setMessage = $this->setMessage($top_up_order, '系统通知', $des);//@todo 暂时注释，等待极光推动服务注册好后在开发
            }
        } catch (\Exception $exception) {
            Log::debug('Wechat BUG', $exception->getMessage());
        }
        $str = '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        return $str;// laravel 框架中请直接 `return $pay->success()`
        //return $pay->success()->send();// laravel 框架中请直接 `return $pay->success()`
    }
}